Title: [waffle-scm] [788] trunk/examples/freemarker-example/src/main/webapp: WAFFLE-92: Added support for registrar-driven navigation menus.

Diff

Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java (787 => 788)

--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -1,8 +1,12 @@
 package org.codehaus.waffle.example.freemarker;
 
+import static java.util.Arrays.asList;
 import static org.codehaus.waffle.bind.converters.DateValueConverter.DAY_FORMAT_KEY;
 import static org.codehaus.waffle.bind.converters.DateValueConverter.TIME_FORMAT_KEY;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.codehaus.waffle.ComponentRegistry;
@@ -15,6 +19,8 @@
 import org.codehaus.waffle.example.freemarker.converters.PersonListValueConverter;
 import org.codehaus.waffle.example.freemarker.converters.PersonValueConverter;
 import org.codehaus.waffle.example.freemarker.persister.SimplePersonPersister;
+import org.codehaus.waffle.menu.Menu;
+import org.codehaus.waffle.menu.MenuAwareController;
 import org.codehaus.waffle.registrar.AbstractRegistrar;
 import org.codehaus.waffle.registrar.Registrar;
 
@@ -43,6 +49,14 @@
         finder.registerConverter((ValueConverter) getRegistered(PersonValueConverter.class));
         finder.registerConverter((ValueConverter) getRegistered(PersonListValueConverter.class));
         register("people/manage", PersonController.class);
+        register("home", MenuAwareController.class);
+        registerInstance(createMenu());
     }
 
+    private Menu createMenu() {
+        Map<String, List<String>> content = new HashMap<String, List<String>>();
+        content.put("Home", asList("Home:home"));
+        content.put("People", asList("Manage:people/manage"));
+        return new Menu(content);
+    }
 }

Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java (787 => 788)

--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/controller/PersonController.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -13,11 +13,13 @@
 import org.codehaus.waffle.example.freemarker.model.Person.Type;
 import org.codehaus.waffle.example.freemarker.persister.PersistablePerson;
 import org.codehaus.waffle.example.freemarker.persister.PersonPersister;
+import org.codehaus.waffle.menu.Menu;
+import org.codehaus.waffle.menu.MenuAwareController;
 import org.codehaus.waffle.view.ExportView;
 import org.codehaus.waffle.view.View;
 
 @SuppressWarnings("serial")
-public class PersonController implements Serializable {
+public class PersonController extends MenuAwareController implements Serializable {
     private final PersonPersister persister;
     private final DateProvider dateProvider;
     private Person person;
@@ -25,7 +27,8 @@
     private List<String> skills = Arrays.asList("Magician", "Apprentice");
     private Long id;
 
-    public PersonController(PersonPersister persister, DateProvider dateProvider) {
+    public PersonController(Menu menu, PersonPersister persister, DateProvider dateProvider) {
+        super(menu);
         this.persister = persister;
         this.dateProvider = dateProvider;
     }

Modified: trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml (787 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/webapp/WEB-INF/web.xml	2008-08-27 14:44:50 UTC (rev 788)
@@ -91,7 +91,7 @@
 
   <!-- Welcome files -->
   <welcome-file-list>
-    <welcome-file>index.ftl</welcome-file>
+    <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 
   <!-- Security -->

Added: trunk/examples/freemarker-example/src/main/webapp/home.ftl (0 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/home.ftl	                        (rev 0)
+++ trunk/examples/freemarker-example/src/main/webapp/home.ftl	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <title>Waffle: FreeMarker example</title>
+</head>
+<body>
+    <#include "/navigation.ftl" parse="true">
+    <div id="content">
+        <h1>Waffle example with Freemarker</h1>
+        <p>Welcome to the Waffle Freemarker/Sitemesh example.  Choose an action from the navigation menu.</p>
+    </div>
+</body>
+</html>
\ No newline at end of file

Deleted: trunk/examples/freemarker-example/src/main/webapp/index.ftl (787 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/index.ftl	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/webapp/index.ftl	2008-08-27 14:44:50 UTC (rev 788)
@@ -1,11 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-        "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-  <title>Waffle: FreeMarker example</title>
-</head>
-<body>
-    <h1>Waffle example with Freemarker</h1>
-    <p>Welcome to the Waffle Freemarker/Sitemesh example.  Choose an action from the navigation</p>
-</body>
-</html>
\ No newline at end of file

Copied: trunk/examples/freemarker-example/src/main/webapp/index.jsp (from rev 787, trunk/examples/freemarker-example/src/main/webapp/index.ftl) (0 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/index.jsp	                        (rev 0)
+++ trunk/examples/freemarker-example/src/main/webapp/index.jsp	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,3 @@
+<jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" version="2.0">
+<c:redirect url=""
+</jsp:root>
\ No newline at end of file

Property changes: trunk/examples/freemarker-example/src/main/webapp/index.jsp

Name: svn:mergeinfo
   + 

Modified: trunk/examples/freemarker-example/src/main/webapp/layout.ftl (787 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/layout.ftl	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/webapp/layout.ftl	2008-08-27 14:44:50 UTC (rev 788)
@@ -9,8 +9,6 @@
 <body>
   <#include "/header.ftl" parse="true">
   <hr/>
-  <#include "/navigation.ftl" parse="true">
-  <hr/>
     ${body}
   <hr/>
   <#include "/footer.ftl" parse="true">

Modified: trunk/examples/freemarker-example/src/main/webapp/navigation.ftl (787 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/navigation.ftl	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/webapp/navigation.ftl	2008-08-27 14:44:50 UTC (rev 788)
@@ -1,3 +1,16 @@
 <div id="navigation">
-[Navigation]   <a href="" Maintenance</a>
+  <#if controller.menu??>
+    <div id="menu">
+        <#assign menu=controller.getMenu()>
+        <#list menu.groups as group>
+        <div class="menu-group menu-entry"><a>${group.title}</a>
+            <div id="menu-group-content${group_index}" class="menu-group-content">
+            <#list group.entries as entry>
+                <div class="menu-entry"><a href=""
+            </#list>
+            </div>
+        </div>
+        </#list>
+    </div>    
+    </#if>
 </div>
\ No newline at end of file

Modified: trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl (787 => 788)

--- trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl	2008-08-26 14:45:49 UTC (rev 787)
+++ trunk/examples/freemarker-example/src/main/webapp/people/manage.ftl	2008-08-27 14:44:50 UTC (rev 788)
@@ -5,6 +5,8 @@
     <title>Select a person</title>  
 </head>
 <body>
+<#include "/navigation.ftl" parse="true">
+<div id="content">
 <form action="" method="post">
 
     <h3>Waffle example: Select Person</h3>
@@ -57,6 +59,7 @@
     </div>
 
 </form>
+</div>
 </body>
 
 </html>
\ No newline at end of file

Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java (0 => 788)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java	                        (rev 0)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/Menu.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) terms as published in http://waffle.codehaus.org/license.html
+ */
+package org.codehaus.waffle.menu;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Represents the menu holding the navigation model. Menus entries are divided into groups.
+ * Content can be provided as a map, keyed on group title, of lists of entries where each entry
+ * is a colon-separated string "title:path".
+ * 
+ * @author Mauro Talevi
+ */
+public class Menu {
+
+    private static final String COLON = ":";
+    private List<Group> groups;
+
+    public Menu() {
+        this(new ArrayList<Group>());
+    }
+
+    public Menu(List<Group> groups) {
+        this.groups = groups;
+    }
+
+    public Menu(Map<String, List<String>> content) {
+        this(toGroups(content));
+    }
+
+    private static List<Group> toGroups(Map<String, List<String>> content) {
+        List<Group> groups = new ArrayList<Group>();
+        for (String title : content.keySet()) {
+            groups.add(new Group(title, toEntries(content.get(title))));
+        }
+        return groups;
+    }
+
+    private static List<Entry> toEntries(List<String> content) {
+        List<Entry> entries = new ArrayList<Entry>();
+        for (String entry : content) {
+            String[] split = entry.split(COLON);
+            if (split.length > 1) {
+                entries.add(new Entry(split[0], split[1]));
+            }
+        }
+        return entries;
+    }
+
+    public List<Group> getGroups() {
+        return groups;
+    }
+
+    public static class Group {
+        private String title;
+        private List<Entry> entries;
+
+        public Group(String title, List<Entry> entries) {
+            this.title = title;
+            this.entries = entries;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public List<Entry> getEntries() {
+            return entries;
+        }
+
+    }
+
+    public static class Entry {
+
+        private String title;
+        private String path;
+
+        public Entry(String title, String path) {
+            this.title = title;
+            this.path = path;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public String getPath() {
+            return path;
+        }
+
+    }
+}

Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java (0 => 788)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java	                        (rev 0)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAware.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) terms as published in http://waffle.codehaus.org/license.html
+ */
+package org.codehaus.waffle.menu;
+
+/**
+ * Implemented by any controller that requires a menu
+ * 
+ * @author Mauro Talevi
+ */
+public interface MenuAware {
+
+    Menu getMenu();
+
+}

Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java (0 => 788)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java	                        (rev 0)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/menu/MenuAwareController.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) terms as published in http://waffle.codehaus.org/license.html
+ */
+package org.codehaus.waffle.menu;
+
+/**
+ * Menu-aware controller that can be used as base class.
+ * 
+ * @author Mauro Talevi
+ */
+public class MenuAwareController implements MenuAware {
+
+    private Menu menu;
+
+    public MenuAwareController(Menu menu) {
+        this.menu = menu;
+    }
+
+    public Menu getMenu() {
+        return menu;
+    }
+
+}

Added: trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java (0 => 788)

--- trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java	                        (rev 0)
+++ trunk/waffle-core/src/test/java/org/codehaus/waffle/menu/MenuTest.java	2008-08-27 14:44:50 UTC (rev 788)
@@ -0,0 +1,48 @@
+package org.codehaus.waffle.menu;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.waffle.menu.Menu.Entry;
+import org.codehaus.waffle.menu.Menu.Group;
+import org.junit.Test;
+
+/**
+ * @author Mauro Talevi
+ */
+public class MenuTest {
+
+    @Test
+    public void canCreateMenu() {
+        Map<String, List<String>> content = new HashMap<String, List<String>>();
+        content.put("Group1", asList("entry11:path11", "entry12:path12"));
+        content.put("Group2", asList("entry21:path21", "entry22:path22"));
+        Menu menu = new Menu(content);
+        List<Group> groups = menu.getGroups();
+        assertEquals(2, groups.size());
+        assertEquals("Group1", groups.get(0).getTitle());
+        assertEquals("Group2", groups.get(1).getTitle());
+        List<Entry> entries1 = groups.get(0).getEntries();
+        assertEquals("entry11", entries1.get(0).getTitle());
+        assertEquals("entry12", entries1.get(1).getTitle());
+        assertEquals("path11", entries1.get(0).getPath());
+        assertEquals("path12", entries1.get(1).getPath());
+        List<Entry> entries2 = groups.get(1).getEntries();
+        assertEquals("entry21", entries2.get(0).getTitle());
+        assertEquals("entry22", entries2.get(1).getTitle());
+        assertEquals("path21", entries2.get(0).getPath());
+        assertEquals("path22", entries2.get(1).getPath());
+    }
+
+    @Test
+    public void canCreateMenuAwareController() {
+        Menu menu = new Menu();
+        MenuAwareController controller = new MenuAwareController(menu);
+        assertEquals(menu, controller.getMenu());
+    }
+
+}


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to